DataConnectors/O365 DataCSharp/Teams.CustomConnector.Serverless/EgressTeamsLogs.cs (102 lines of code) (raw):
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using Teams.CustomConnector.Common;
using Teams.CustomConnector.Models;
using Teams.CustomConnector.Sentinel;
using Teams.CustomConnector.StorageHandler;
namespace Teams.CustomConnector.Serverless
{
/// <summary></summary>
public static class EgressTeamsLogs
{
private static List<AuditDetailedReport> auditDetailedReports;
/// <summary>
/// Runs the specified my timer.
/// </summary>
/// <param name="myTimer">My timer.</param>
/// <param name="log">The log.</param>
[FunctionName("EgressTeamsLogs")]
public static void Run([TimerTrigger("0 */10 * * * *")]TimerInfo myTimer, ILogger log)
{
log.LogInformation(Constants.RequestProcessingStarted);
StorageHandler.StorageHandler storageHandler = new StorageHandler.StorageHandler(log);
OperationDetails LastOperationDetails = null;
try
{
log.LogInformation(Constants.RequestLastExecutionTime);
//Fetch the last execution time and status
LastOperationDetails = storageHandler.GetLastOperationDetailsFromLogsAsync(Environment.GetEnvironmentVariable(Constants.LogFileName)).Result;
//if there is the first time or no info found
if (LastOperationDetails?.LastRunEndTime == null)
{
LastOperationDetails = new OperationDetails();
log.LogWarning(Constants.LastExecutionTimeNotFound);
try
{
//Fetch the info form configuration
//Start set to current time - connectioninterval
LastOperationDetails.LastRunEndTime = DateTime.Parse(Environment.GetEnvironmentVariable(Constants.AuditLogExtractionStartDate));
LastOperationDetails.LastRunStartTime = LastOperationDetails.LastRunEndTime?.AddMinutes(-Convert.ToInt32(Environment.GetEnvironmentVariable(Constants.ConnectionIntervalInMinutes)));
}
catch (Exception)
{
//if no configuration is found , set the start time and end time
LastOperationDetails.LastRunEndTime = DateTime.UtcNow;
LastOperationDetails.LastRunStartTime = LastOperationDetails.LastRunEndTime?.AddMinutes(-Convert.ToInt32(Environment.GetEnvironmentVariable(Constants.ConnectionIntervalInMinutes)));
log.LogWarning(Constants.AuditLogExtractionStartDateMissing);
}
}
else
{
LastOperationDetails.LastRunStartTime = LastOperationDetails.LastRunEndTime;
LastOperationDetails.LastRunEndTime = LastOperationDetails.LastRunEndTime?.AddMinutes(Convert.ToInt32(Environment.GetEnvironmentVariable(Constants.ConnectionIntervalInMinutes)));
}
log.LogInformation(Constants.OMSRequestProcessStarted);
log.LogWarning($"Daterange set: start time : { LastOperationDetails.LastRunStartTime} , endtime { LastOperationDetails.LastRunEndTime}");
Teams.CustomConnector.Processor.Processor processor = new Processor.Processor(log);
//fetch the details.
auditDetailedReports = processor.Process(LastOperationDetails.LastRunStartTime?.ToString("G", CultureInfo.InvariantCulture), LastOperationDetails.LastRunEndTime?.ToString("G", CultureInfo.InvariantCulture)).Result;
log.LogInformation($"Total {auditDetailedReports.Count} of audit logs found");
if (auditDetailedReports.Count > 0)
{
//upload to the container
var reports = JsonConvert.SerializeObject(auditDetailedReports);
if (Convert.ToBoolean(Environment.GetEnvironmentVariable(Constants.EnableDirectInjestionToWorkSpace)))
{
string SentinelWkSpaceId = string.Empty;
string SentinelSharedkey = string.Empty;
if (Convert.ToBoolean(Environment.GetEnvironmentVariable(Constants.KeyVaultEnabled)))
{
SentinelWkSpaceId = KeyVaultHelper.GetKeyValueAsync(Constants.SentinelCustomerId).Result;
SentinelSharedkey = KeyVaultHelper.GetKeyValueAsync(Constants.SentinelSharedkey).Result;
}
else
{
SentinelWkSpaceId = Environment.GetEnvironmentVariable(Constants.SentinelCustomerId);
SentinelSharedkey = Environment.GetEnvironmentVariable(Constants.SentinelSharedkey);
}
AzureLogAnalyticsConnector azureLogAnalyticsConnector= new Sentinel.AzureLogAnalyticsConnector(SentinelWkSpaceId, SentinelSharedkey, "TeamsAuditLogs");
azureLogAnalyticsConnector.Post(reports);
}
if (Convert.ToBoolean(Environment.GetEnvironmentVariable(Constants.EnableArchiving)))
{
Task.Run(async () => await storageHandler.UploadDataToContainerAsync(OperationType.Data, LastOperationDetails.LastRunStartTime?.Ticks.ToString(), reports));
}
}
LastOperationDetails.IsLastRunSuccessful = true;
}
catch (Exception ex)
{
log.LogError(ex, Constants.OMSRequestProcessFailed);
log.LogError($"{Constants.FatalError} , {ex.Message} , {ex.InnerException.ToString()}");
LastOperationDetails.IsLastRunSuccessful = false;
}
if (!LastOperationDetails.IsLastRunSuccessful)
{
LastOperationDetails.TotalFailCountSinceLastSuccessfulRun++;
}
else
LastOperationDetails.TotalFailCountSinceLastSuccessfulRun = 0;
//update the last run details.
LastOperationDetails.TotalAuditRecordsProcessed = auditDetailedReports.Count;
LastOperationDetails.TotalRecordsProcessedInLifeTime += LastOperationDetails.TotalAuditRecordsProcessed;
var opdetails = JsonConvert.SerializeObject(LastOperationDetails);
Task.Run(() =>
storageHandler.UploadDataToContainerAsync(OperationType.Log,
Environment.GetEnvironmentVariable(Constants.LogFileName),
opdetails));
log.LogInformation(Constants.RequestProcessed);
}
}
}